package com.mybatis;

import org.apache.ibatis.executor.statement.PreparedStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Properties;

/**
 * @Signature : type:拦截的四大Handler之一,method:handler中的方法名，args:handler中的方法的入参
 * 插件编写：
 *  1.编写Interceptor的实现类
 *  2.使用@Intercepts()注解完成插件签名
 *  3.将写好的插件注册到全局配置文件中
 */
@Intercepts({
		@Signature(type= StatementHandler.class,method="parameterize",args = Statement.class)
})
public class MyPlugins implements Interceptor{

	/**
	 * 拦截目标对象的方法的执行
	 * @param invocation
	 * @return
	 * @throws Throwable
	 */
	@Override
	public Object intercept(Invocation invocation) throws Throwable {
		System.out.println("intercept...");
		Object proceed = invocation.proceed();
		return proceed;
	}

	/**
	 * 包装目标对象： 包装：为目标对象创建一个代理对象
	 * @param target
	 * @return
	 */
	@Override
	public Object plugin(Object target) {
		System.out.println("plugin...."+target.toString());
		//我们可以借助Plugin的wrap方法来使用当前Interceptor包装
		Object wrap = Plugin.wrap(target, this);
		//返回为当前target创建的动态代理
		return wrap;
	}

	/**
	 * 将插件注册时的属性设置进来
	 * @param properties
	 */
	@Override
	public void setProperties(Properties properties) {
		System.out.println(properties);
	}
}
